package com.xdb.sqlparser.ast;

import com.xdb.sqlparser.visitor.SQLAstVisitor;

import java.util.ArrayList;
import java.util.List;

public class SQLOver extends AbstractSQLObjectImpl {

	protected final List<SQLExpr> partitionBy = new ArrayList<SQLExpr>();
	protected SQLOrderBy orderBy;

	public SQLOver() {

	}

	public SQLOver(SQLOrderBy orderBy) {
		this.setOrderBy(orderBy);
	}

	@Override
	protected void accept0(SQLAstVisitor visitor) {
		if (visitor.visit(this)) {
			acceptChild(visitor, this.partitionBy);
			acceptChild(visitor, this.orderBy);
		}
		visitor.endVisit(this);
	}

	public SQLOrderBy getOrderBy() {
		return orderBy;
	}

	public void setOrderBy(SQLOrderBy orderBy) {
		if (orderBy != null) {
			orderBy.setParent(this);
		}
		this.orderBy = orderBy;
	}

	public List<SQLExpr> getPartitionBy() {
		return partitionBy;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((orderBy == null) ? 0 : orderBy.hashCode());
		result = prime * result + partitionBy.hashCode();
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (getClass() != obj.getClass()) {
			return false;
		}
		SQLOver other = (SQLOver) obj;
		if (orderBy == null) {
			if (other.orderBy != null) {
				return false;
			}
		} else if (!orderBy.equals(other.orderBy)) {
			return false;
		}
		return partitionBy.equals(other.partitionBy);
	}

}
